package gitee_hook

import (
	"time"

	"jihulab.com/linksaas/proto-gen-go/events/events_gitee"
)

type Commit struct {
	Id        string   `json:"id"`
	TreeId    string   `json:"tree_id"`    // commit tree oid。eg：db78f3594ec0683f5d857ef731df0d860f14f2b2
	ParentIds []string `json:"parent_ids"` // commit parent_ids。eg：['a3bddf21a35af54348aae5b0f5627e6ba35be51c']
	Message   string   `json:"message"`    // commit 的信息。eg：fix(cache): 修复了缓存问题
	Timestamp string   `json:"timestamp"`  // commit 的时间。eg：2020-01-01T00:00:00+08:00
	Url       string   `json:"url"`        // commit 对应的 Gitee url。eg：https://gitee.com/mayun-team/oauth2_dingtalk/commit/664b34859fc4a924cd60be2592c0fc788fbeaf8f
	Author    *User    `json:"author"`     // 作者信息。
	Committer *User    `json:"committer"`  // 提交者信息。
	Distinct  bool     `json:"distinct"`   // 特殊的 commit，没任何改动，如 tag
	Added     []string `json:"added"`      // 新加入的文件名。eg：['README.md']
	Removed   []string `json:"removed"`    // 被移除的文件名。eg：['README.md']
	Modified  []string `json:"modified"`   // 修改过的文件名。eg：['README.md']
}

func (item *Commit) ToProtoBuf() *events_gitee.Commit {
	ret := &events_gitee.Commit{
		Id:        item.Id,
		TreeId:    item.TreeId,
		ParentIds: item.ParentIds,
		Msg:       item.Message,
		Url:       item.Url,
		Author:    []*events_gitee.User{},
		Committer: []*events_gitee.User{},
		Distinct:  item.Distinct,
		Added:     item.Added,
		Removed:   item.Removed,
		Modified:  item.Modified,
	}
	if ret.ParentIds == nil {
		ret.ParentIds = []string{}
	}
	if ret.Added == nil {
		ret.Added = []string{}
	}
	if ret.Removed == nil {
		ret.Removed = []string{}
	}
	if ret.Modified == nil {
		ret.Modified = []string{}
	}
	if item.Author != nil {
		ret.Author = append(ret.Author, item.Author.ToProtoBuf())
	}
	if item.Committer != nil {
		ret.Committer = append(ret.Committer, item.Committer.ToProtoBuf())
	}
	ts, err := time.Parse(time.RFC3339, item.Timestamp)
	if err == nil {
		ret.Timestamp = ts.UnixNano() / 1e6
	}
	return ret
}

type Project struct {
	Id                int32   `json:"id"`
	Name              string  `json:"name"`                // 仓库名。eg：gitee
	Path              string  `json:"path"`                // 仓库所属的空间地址。eg：oschian
	FullName          string  `json:"full_name"`           // 完整的名字，name + path。eg：gitee/oschian
	Owner             *User   `json:"owner"`               // 仓库的所有者。
	Private           bool    `json:"private"`             // 是否公开。
	HtmlUrl           string  `json:"html_url"`            // 对应 Gitee 的 url。eg：https://gitee.com/oschina/git-osc
	Url               string  `json:"url"`                 // 与上面 html_url 一致
	Description       string  `json:"description"`         // 仓库描述。eg：这是一个开源仓库...
	Fork              bool    `json:"fork"`                // 是不是 fork 仓库。
	CreatedAt         string  `json:"created_at"`          // 仓库的创建时间。eg：2020-01-01T00:00:00+08:00
	UpdatedAt         string  `json:"updated_at"`          // 仓库的更新时间。eg：2020-01-01T00:00:00+08:00
	PushedAt          string  `json:"pushed_at"`           // 仓库的最近一次推送时间。eg：2020-01-01T00:00:00+08:00
	GitUrl            string  `json:"git_url"`             // 仓库的 git 地址。eg：git://gitee.com:oschina/git-osc.git
	SshUrl            string  `json:"ssh_url"`             // 仓库的 ssh 地址。eg：git@gitee.com:oschina/git-osc.git
	CloneUrl          string  `json:"clone_url"`           // 仓库的 clone 地址。eg：https://gitee.com/oschina/git-osc.git
	SvnUrl            string  `json:"svn_url"`             // 仓库的 svn 地址。eg：svn://gitee.com/oschina/git-osc
	GitHttpUrl        string  `json:"git_http_url"`        // 与上面的 clone_url 一致。
	GitSshUrl         string  `json:"git_ssh_url"`         // 与上面的 ssh_url 一致。
	GitSvnUrl         string  `json:"git_svn_url"`         // 与上面的 svn_url 一致。
	Homepage          *string `json:"homepage"`            // 仓库的网页主页。eg：https://gitee.com
	StargazersCount   int32   `json:"stargazers_count"`    // 仓库的 star 数量。
	WatchersCount     int32   `json:"watchers_count"`      // 仓库的 watch 数量。
	ForksCount        int32   `json:"forks_count"`         // 仓库的 fork 数量。
	Language          string  `json:"language"`            // 仓库的编程语言。eg： Ruby
	HasIssues         bool    `json:"has_issues"`          // 仓库的是否开启了 issue 功能。
	HasWiki           bool    `json:"has_wiki"`            // 仓库的是否开启了 wiki 功能。
	HasPages          bool    `json:"has_pages"`           // 仓库的是否开启了 page 服务。
	License           *string `json:"license"`             // 仓库的开源协议。eg：MIT
	OpenIssuesCount   int32   `json:"open_issues_count"`   // 仓库开启状态的 issue 总数。
	DefaultBranch     string  `json:"default_branch"`      // 仓库的默认复制。eg：master
	Namespace         string  `json:"namespace"`           // 仓库所属的 Gitee 地址。eg：oschina
	NameWithNamespace string  `json:"name_with_namespace"` // 与上面的 full_name 一致。
	PathWithNamespace string  `json:"path_with_namespace"` // 仓库的在 Gitee 的资源唯一标识。eg：oschia/git-osc
}

func (item *Project) ToProtoBuf() *events_gitee.Project {
	ret := &events_gitee.Project{
		Id:          item.Id,
		Name:        item.Name,
		Path:        item.Path,
		FullName:    item.FullName,
		Owner:       []*events_gitee.User{},
		PrivateFlag: item.Private,
		HtmlUrl:     item.HtmlUrl,
		Url:         item.Url,
		Description: item.Description,
		Fork:        item.Fork,

		GitUrl:            item.GitUrl,
		SshUrl:            item.SshUrl,
		CloneUrl:          item.CloneUrl,
		SvnUrl:            item.SvnUrl,
		GitHttpUrl:        item.GitHttpUrl,
		GitSshUrl:         item.GitSshUrl,
		GitSvnUrl:         item.GitSvnUrl,
		Homepage:          []string{},
		StargazersCount:   item.StargazersCount,
		WatchersCount:     item.WatchersCount,
		ForksCount:        item.ForksCount,
		Language:          item.Language,
		HasIssues:         item.HasIssues,
		HasWiki:           item.HasWiki,
		HasPages:          item.HasPages,
		License:           []string{},
		OpenIssuesCount:   item.OpenIssuesCount,
		DefaultBranch:     item.DefaultBranch,
		Namespace:         item.Namespace,
		NameWithNamespace: item.NameWithNamespace,
		PathWithNamespace: item.PathWithNamespace,
	}

	if item.Owner != nil {
		ret.Owner = append(ret.Owner, item.Owner.ToProtoBuf())
	}
	if item.Homepage != nil && *item.Homepage != "" {
		ret.Homepage = append(ret.Homepage, *item.Homepage)
	}
	if item.License != nil && *item.License != "" {
		ret.License = append(ret.License, *item.License)
	}
	createTs, err := time.Parse(time.RFC3339, item.CreatedAt)
	if err == nil {
		ret.CreatedAt = createTs.UnixNano() / 1e6
	}
	updateTs, err := time.Parse(time.RFC3339, item.UpdatedAt)
	if err == nil {
		ret.UpdatedAt = updateTs.UnixNano() / 1e6
	}
	pushTs, err := time.Parse(time.RFC3339, item.PushedAt)
	if err == nil {
		ret.PushedAt = pushTs.UnixNano() / 1e6
	}
	return ret
}

type User struct {
	Id        *int32  `json:"id"`
	Name      string  `json:"name"`       // 用户的昵称。eg：红薯
	Email     string  `json:"email"`      // 用户的邮箱。eg：git@oschina.cn
	Username  *string `json:"username"`   // 用户的 Gitee 个人空间地址。eg：gitee
	Url       *string `json:"url"`        // 用户的 Gitee 个人主页 url。eg：https://gitee.com/gitee
	Login     *string `json:"login"`      // 与上面的 username 一致。
	AvatarUrl *string `json:"avatar_url"` // 用户头像 url。eg：https://gitee.com/assets/favicon.ico
	HtmlUrl   *string `json:"html_url"`   // 与上面的 url 一致。
	Type      *string `json:"type"`       // 用户类型，目前固定为 User。
	SiteAdmin bool    `json:"site_admin"` // 是不是管理员。
	Time      *string `json:"time"`       // git commit 中的时间。eg：2020-01-01T00:00:00+08:00
	Remark    *string `json:"remark"`     // 用户备注名。eg：Ruby 大神
}

func (item *User) ToProtoBuf() *events_gitee.User {
	ret := &events_gitee.User{
		Id:        []int32{},
		Name:      item.Name,
		Email:     item.Email,
		Username:  []string{},
		Url:       []string{},
		Login:     []string{},
		AvatarUrl: []string{},
		HtmlUrl:   []string{},
		TypeStr:   []string{},
		SiteAdmin: item.SiteAdmin,
		Time:      []int64{},
		Remark:    []string{},
	}
	if item.Id != nil {
		ret.Id = append(ret.Id, *item.Id)
	}
	if item.Username != nil && *item.Username != "" {
		ret.Username = append(ret.Username, *item.Username)
	}
	if item.Url != nil && *item.Url != "" {
		ret.Url = append(ret.Url, *item.Url)
	}
	if item.Login != nil && *item.Login != "" {
		ret.Login = append(ret.Login, *item.Login)
	}
	if item.AvatarUrl != nil && *item.AvatarUrl != "" {
		ret.AvatarUrl = append(ret.AvatarUrl, *item.AvatarUrl)
	}
	if item.HtmlUrl != nil && *item.HtmlUrl != "" {
		ret.HtmlUrl = append(ret.HtmlUrl, *item.HtmlUrl)
	}
	if item.Type != nil && *item.Type != "" {
		ret.TypeStr = append(ret.TypeStr, *item.Type)
	}
	if item.Time != nil && *item.Time != "" {
		ts, err := time.Parse(time.RFC3339, *item.Time)
		if err == nil {
			ret.Time = append(ret.Time, ts.UnixNano()/1e6)
		}
	}
	if item.Remark != nil && *item.Remark != "" {
		ret.Remark = append(ret.Remark, *item.Remark)
	}
	return ret
}

type Enterprise struct {
	Name string `json:"name"` //企业名。eg：开源中国
	Url  string `json:"url"`  //企业在 Gitee 上的 url。eg：https://gitee.com/oschina
}

func (item *Enterprise) ToProtoBuf() *events_gitee.Enterprise {
	return &events_gitee.Enterprise{
		Name: item.Name,
		Url:  item.Url,
	}
}

type Label struct {
	Id    int32  `json:"id"`
	Name  string `json:"name"`  // 标签名。eg：fixbug
	Color string `json:"color"` // 标签的颜色。eg：000000
}

func (item *Label) ToProtoBuf() *events_gitee.Label {
	return &events_gitee.Label{
		Id:    item.Id,
		Name:  item.Name,
		Color: item.Color,
	}
}

type Milestone struct {
	HtmlUrl      string  `json:"html_url"` // Gitee 上对应的 url。eg：https://gitee.com/oschina/git-osc/milestones/1
	Id           int32   `json:"id"`
	Number       int32   `json:"number"`        // 与上面的 id 一致
	Title        string  `json:"title"`         // 里程碑的标题。eg：开源计划
	Description  string  `json:"description"`   // 里程碑的详细描述。eg：走向世界
	OpenIssues   int32   `json:"open_issues"`   // 开启状态的 issue 数量
	ClosedIssues int32   `json:"closed_issues"` // 关闭状态的 issue 数量
	State        string  `json:"state"`         // 里程碑的状态。eg：open
	CreatedAt    string  `json:"created_at"`    // 里程碑创建的时间。eg：2020-01-01T00:00:00+08:00
	UpdatedAt    string  `json:"updated_at"`    // 里程碑更新的时间。eg：2020-01-01T00:00:00+08:00
	DueOn        *string `json:"due_on"`        // 里程碑结束的时间。eg：2020-01-01T00:00:00+08:00
}

func (item *Milestone) ToProtoBuf() *events_gitee.Milestone {
	ret := &events_gitee.Milestone{
		HtmlUrl:      item.HtmlUrl,
		Id:           item.Id,
		Number:       item.Number,
		Title:        item.Title,
		Description:  item.Description,
		OpenIssues:   item.OpenIssues,
		ClosedIssues: item.ClosedIssues,
		State:        item.State,
		DueOn:        []int64{},
	}
	createTs, err := time.Parse(time.RFC3339, item.CreatedAt)
	if err == nil {
		ret.CreatedAt = createTs.UnixNano() / 1e6
	}
	updateTs, err := time.Parse(time.RFC3339, item.UpdatedAt)
	if err == nil {
		ret.UpdatedAt = updateTs.UnixNano() / 1e6
	}
	if item.DueOn != nil && *item.DueOn != "" {
		ts, err := time.Parse(time.RFC3339, *item.DueOn)
		if err == nil {
			ret.DueOn = append(ret.DueOn, ts.UnixNano()/1e6)
		}
	}
	return ret
}

type Issue struct {
	HtmlUrl       string     `json:"html_url"` // Gitee 上对应的 url。eg：https://gitee.com/oschina/git-osc/issues/1
	Id            int32      `json:"id"`
	Number        string     `json:"number"`        // issue 对应的标识。eg：IG6E9
	Title         string     `json:"title"`         // issue 标题。eg：这是一个 issue 标题
	User          *User      `json:"user"`          // issue 创建者。
	Labels        []*Label   `json:"labels"`        // issue 对应的标签。
	State         string     `json:"state"`         // issue 状态。eg：open
	StateName     string     `json:"state_name"`    // issue 状态名。eg：代办的
	TypeName      string     `json:"type_name"`     // issue 类型。eg：任务
	Assignee      *User      `json:"assignee"`      // issue 负责人。
	Collaborators []*User    `json:"collaborators"` // issue 协助者。
	Milestone     *Milestone `json:"milestone"`     // issue 所属的里程碑。
	Comments      int32      `json:"comments"`      // issue 的评论总数
	CreatedAt     string     `json:"created_at"`    // issue 的创建时间。eg：2020-01-01T00:00:00+08:00
	UpdatedAt     string     `json:"updated_at"`    // issue 的更新时间。eg：2020-01-01T00:00:00+08:00
	Body          string     `json:"body"`          // issue 的内容体。eg：数据库优化...
}

func (item *Issue) ToProtoBuf() *events_gitee.Issue {
	ret := &events_gitee.Issue{
		HtmlUrl:       item.HtmlUrl,
		Id:            item.Id,
		Number:        item.Number,
		Title:         item.Title,
		User:          []*events_gitee.User{},
		Labels:        []*events_gitee.Label{},
		State:         item.State,
		StateName:     item.StateName,
		TypeName:      item.TypeName,
		Assignee:      []*events_gitee.User{},
		Collaborators: []*events_gitee.User{},
		Milestone:     []*events_gitee.Milestone{},
		Comments:      item.Comments,
		Body:          item.Body,
	}
	if item.User != nil {
		ret.User = append(ret.User, item.User.ToProtoBuf())
	}
	if item.Labels != nil {
		for _, label := range item.Labels {
			if label != nil {
				ret.Labels = append(ret.Labels, label.ToProtoBuf())
			}
		}
	}
	if item.Assignee != nil {
		ret.Assignee = append(ret.Assignee, item.Assignee.ToProtoBuf())
	}
	if item.Collaborators != nil {
		for _, collabor := range item.Collaborators {
			if collabor != nil {
				ret.Collaborators = append(ret.Collaborators, collabor.ToProtoBuf())
			}
		}
	}
	if item.Milestone != nil {
		ret.Milestone = append(ret.Milestone, item.Milestone.ToProtoBuf())
	}
	createTs, err := time.Parse(time.RFC3339, item.CreatedAt)
	if err == nil {
		ret.CreatedAt = createTs.UnixNano() / 1e6
	}
	updateTs, err := time.Parse(time.RFC3339, item.UpdatedAt)
	if err == nil {
		ret.UpdatedAt = updateTs.UnixNano() / 1e6
	}
	return ret
}

type Note struct {
	Id        int32   `json:"id"`
	Body      string  `json:"body"`       // 评论内容。eg：好的东西应该开源...
	User      *User   `json:"user"`       // 评论的作者信息。
	CreatedAt string  `json:"created_at"` // 评论的创建时间。eg：2020-01-01T00:00:00+08:00
	UpdatedAt string  `json:"updated_at"` // 评论的更新时间。eg：2020-11-11T11:11:11+08:00
	HtmlUrl   string  `json:"html_url"`   // 这条评论在 Gitee 上的 url。eg：https://gitee.com/oschina/git-osc#note_1
	Position  *string `json:"position"`   // 在代码 commit 评论中对应的代码位置。eg：76ec1c6df700af34ae5f8dd00bd7bcb56c1bd706_9_9
	CommitId  *string `json:"commit_id"`  // 在代码 commit 评论中对应的 commit id。eg：611de62f634d353bb75a290f59fa238ff2d8d3c7
}

func (item *Note) ToProtoBuf() *events_gitee.Note {
	ret := &events_gitee.Note{
		Id:       item.Id,
		Body:     item.Body,
		User:     []*events_gitee.User{},
		HtmlUrl:  item.HtmlUrl,
		Position: []string{},
		CommitId: []string{},
	}
	if item.User != nil {
		ret.User = append(ret.User, item.User.ToProtoBuf())
	}
	if item.Position != nil && *item.Position != "" {
		ret.Position = append(ret.Position, *item.Position)
	}
	if item.CommitId != nil && *item.CommitId != "" {
		ret.CommitId = append(ret.CommitId, *item.CommitId)
	}
	createTs, err := time.Parse(time.RFC3339, item.CreatedAt)
	if err == nil {
		ret.CreatedAt = createTs.UnixNano() / 1e6
	}
	updateTs, err := time.Parse(time.RFC3339, item.UpdatedAt)
	if err == nil {
		ret.UpdatedAt = updateTs.UnixNano() / 1e6
	}
	return ret
}

type Branch struct {
	Label string   `json:"label"` // 分支标记。eg：oschina:master
	Ref   string   `json:"ref"`   // 分支名。eg：master
	Sha   string   `json:"sha"`   // git 提交记录中 sha 值。eg：51b1acb1b4044fcdb2ff8a75ad15a4b655101754
	User  string   `json:"user"`  // 分支所在仓库的所有者信息
	Repo  *Project `json:"repo"`  // 分支所在仓库的信息
}

func (item *Branch) ToProtoBuf() *events_gitee.Branch {
	ret := &events_gitee.Branch{
		Label: item.Label,
		Ref:   item.Ref,
		Sha:   item.Sha,
		User:  item.User,
		Repo:  []*events_gitee.Project{},
	}
	if item.Repo != nil {
		ret.Repo = append(ret.Repo, item.Repo.ToProtoBuf())
	}
	return ret
}

type PullRequest struct {
	Id                 int32      `json:"id"`
	Number             int32      `json:"number"`               // 与上面 id 一致
	State              string     `json:"state"`                // PR 状态。eg：open
	HtmlUrl            string     `json:"html_url"`             // PR 在 Gitee 上 url。eg：https://gitee.com/oschina/pulls/1
	DiffUrl            string     `json:"diff_url"`             // PR diff 信息 url。eg：https://gitee.com/oschina/pulls/1.diff
	PatchUrl           string     `json:"patch_url"`            // PR patch 信息 url。eg：https://gitee.com/oschina/pulls/1.patch
	Title              string     `json:"title"`                // PR 的标题。eg：这是一个 PR 标题
	Body               *string    `json:"body"`                 // PR 的内容。eg：升级服务...
	CreatedAt          string     `json:"created_at"`           // PR 的创建时间。eg：2020-01-01T00:00:00+08:00
	UpdatedAt          string     `json:"updated_at"`           // PR 的更新时间。eg：2020-01-01T00:00:00+08:00
	ClosedAt           *string    `json:"closed_at"`            // PR 的关闭时间。eg：2020-01-01T00:00:00+08:00
	MergedAt           *string    `json:"merged_at"`            // PR 的合并时间。eg：2020-01-01T00:00:00+08:00
	MergeCommitSha     string     `json:"merge_commit_sha"`     // PR 合并产生的 commit id。eg：51b1acb1b4044fcdb2ff8a75ad15a4b655101754
	MergeReferenceName string     `json:"merge_reference_name"` // PR 的源分支目标。eg：refs/pull/1/MERGE
	User               *User      `json:"user"`                 // PR 的创建者。
	Assignee           *User      `json:"assignee"`             // PR 的负责人。
	Assignees          []*User    `json:"assignees"`            // PR 的审核人。
	Tester             *User      `json:"tester"`               // PR 的测试者。
	Testers            []*User    `json:"testers"`              // PR 的所有测试者。
	NeedTest           bool       `json:"need_test"`            // PR 是否需要测试。
	NeedReview         bool       `json:"need_review"`          // PR 是否需要审核。
	Milestone          *Milestone `json:"milestone"`            // PR 所属的里程碑。
	Head               *Branch    `json:"head"`                 // PR 的源分支。
	Base               *Branch    `json:"base"`                 // PR 要合并的目标分支
	Merged             bool       `json:"merged"`               // PR 是否已合并。
	Mergeable          bool       `json:"mergeable"`            // PR 是否可以合并。
	MergeStatus        string     `json:"merge_status"`         // PR 的合并状态。eg：unchecked
	UpdatedBy          *User      `json:"updated_by"`           // PR 的修改者。
	Comments           int32      `json:"comments"`             // PR 的总评论数量。
	Commits            int32      `json:"commits"`              // PR 的总 commit 数量。
	Additions          int32      `json:"additions"`            // PR 新增了多少行。
	Deletions          int32      `json:"deletions"`            // PR 删除了多少行。
	ChangedFiles       int32      `json:"changed_files"`        // PR 修改了多少行。
}

func (item *PullRequest) ToProtoBuf() *events_gitee.PullRequest {
	ret := &events_gitee.PullRequest{
		Id:                 item.Id,
		Number:             item.Number,
		State:              item.State,
		HtmlUrl:            item.HtmlUrl,
		DiffUrl:            item.DiffUrl,
		PatchUrl:           item.PatchUrl,
		Title:              item.Title,
		Body:               []string{},
		ClosedAt:           []int64{},
		MergedAt:           []int64{},
		MergeCommitSha:     item.MergeCommitSha,
		MergeReferenceName: item.MergeReferenceName,
		User:               []*events_gitee.User{},
		Assignee:           []*events_gitee.User{},
		Assignees:          []*events_gitee.User{},
		Tester:             []*events_gitee.User{},
		Testers:            []*events_gitee.User{},
		NeedTest:           item.NeedTest,
		NeedReview:         item.NeedReview,
		Milestone:          []*events_gitee.Milestone{},
		Head:               []*events_gitee.Branch{},
		Base:               []*events_gitee.Branch{},
		Merged:             item.Merged,
		Mergeable:          item.Mergeable,
		MergeStatus:        item.MergeStatus,
		UpdatedBy:          []*events_gitee.User{},
		Comments:           item.Comments,
		Commits:            item.Commits,
		Additions:          item.Additions,
		Deletions:          item.Deletions,
		ChangedFiles:       item.ChangedFiles,
	}
	if item.Body != nil && *item.Body != "" {
		ret.Body = append(ret.Body, *item.Body)
	}
	if item.ClosedAt != nil && *item.ClosedAt != "" {
		ts, err := time.Parse(time.RFC3339, *item.ClosedAt)
		if err == nil {
			ret.ClosedAt = append(ret.ClosedAt, ts.UnixNano()/1e6)
		}
	}
	if item.MergedAt != nil && *item.MergedAt != "" {
		ts, err := time.Parse(time.RFC3339, *item.MergedAt)
		if err == nil {
			ret.MergedAt = append(ret.MergedAt, ts.UnixNano()/1e6)
		}
	}
	if item.User != nil {
		ret.User = append(ret.User, item.User.ToProtoBuf())
	}
	if item.Assignee != nil {
		ret.Assignee = append(ret.Assignee, item.Assignee.ToProtoBuf())
	}
	if item.Assignees != nil {
		for _, assignee := range item.Assignees {
			if assignee != nil {
				ret.Assignees = append(ret.Assignees, assignee.ToProtoBuf())
			}
		}
	}
	if item.Tester != nil {
		ret.Tester = append(ret.Tester, item.Tester.ToProtoBuf())
	}
	if item.Testers != nil {
		for _, tester := range item.Testers {
			if tester != nil {
				ret.Testers = append(ret.Testers, tester.ToProtoBuf())
			}
		}
	}
	if item.Milestone != nil {
		ret.Milestone = append(ret.Milestone, item.Milestone.ToProtoBuf())
	}
	if item.Head != nil {
		ret.Head = append(ret.Head, item.Head.ToProtoBuf())
	}
	if item.Base != nil {
		ret.Base = append(ret.Base, item.Base.ToProtoBuf())
	}
	if item.UpdatedBy != nil {
		ret.UpdatedBy = append(ret.UpdatedBy, item.UpdatedBy.ToProtoBuf())
	}
	createTs, err := time.Parse(time.RFC3339, item.CreatedAt)
	if err == nil {
		ret.CreatedAt = createTs.UnixNano() / 1e6
	}
	updateTs, err := time.Parse(time.RFC3339, item.UpdatedAt)
	if err == nil {
		ret.UpdatedAt = updateTs.UnixNano() / 1e6
	}
	return ret
}

type ProjectAndRepository struct {
	Project    *Project `json:"project"`
	Repository *Project `json:"repository"`
}

func (item *ProjectAndRepository) ToProtoBuf() *events_gitee.Project {
	tmpPrj := item.Project
	if item.Repository != nil {
		tmpPrj = item.Repository
	}
	if tmpPrj == nil {
		return nil
	}
	return tmpPrj.ToProtoBuf()
}
